// utils/websocket.js
import { SERVER_URL } from '@/config/apiConfig.js';

let socketTask = null;
let connectTimer = null;
let heartTimer = null;
let reconnectCount = 0;
const MAX_RECONNECT_COUNT = 5; // 最大重连次数
const HEARTBEAT_INTERVAL = 30000; // 心跳间隔(ms)
// 初始化WebSocket连接
export function initWebSocket() {
  // 关闭已有连接
  closeWebSocket();

  console.log('正在连接WebSocket服务器:', SERVER_URL);
  
  // 微信小程序特殊处理
  const isWeChatMiniProgram = typeof wx !== 'undefined' && wx.connectSocket;
  const connectOptions = {
    url: SERVER_URL,
    success: () => {
      console.log('WebSocket连接创建成功');
      console.log('连接URL:', SERVER_URL);
      reconnectCount = 0;
    },
    fail: (err) => {
      console.error('WebSocket连接创建失败:', JSON.stringify(err));
      console.error('错误详情:', err.errMsg || err.message);
      
      // 微信小程序特殊错误处理
      if (err.errMsg && err.errMsg.includes('domain')) {
        console.error('请检查微信小程序合法域名配置');
        console.error('开发环境: 在微信开发者工具中勾选 "不校验合法域名"');
        console.error('生产环境: 需要在小程序后台配置 wss://yourdomain.com');
      }
      
      startReconnect();
    }
  };

  // 微信小程序不需要header和protocols参数
  if (!isWeChatMiniProgram) {
    connectOptions.header = {
      'content-type': 'application/json',
    };
    connectOptions.protocols = ['protocol1'];
  }

  socketTask = uni.connectSocket(connectOptions);

  // 移除不支持的onStatusChange方法，使用标准事件监听
  
  // 监听WebSocket连接打开
  socketTask.onOpen(() => {
    console.log('WebSocket连接已打开');
    console.log('连接URL:', SERVER_URL);
    startHeartbeat();
    // 发送登录认证信息并绑定uid
    const uid = uni.getStorageSync('uid');
    console.log('当前用户ID:', uid);
    if (uid) {
      const loginMsg = JSON.stringify({ type: 'login', uid: uid });
      console.log('发送登录消息:', loginMsg);
      sendMessage(loginMsg);
    }
  });

  // 监听WebSocket接收到消息
  socketTask.onMessage((res) => {
    // 全局事件总线发布消息，添加日志
    try {
      // 检查是否是有效的JSON格式
      if (res.data && (res.data.startsWith('{') || res.data.startsWith('['))) {
        const message = JSON.parse(res.data);
        console.log('接收到的消息:', message);
        // 处理不同类型的消息
        switch (message.type) {
          case 'location_check_qiandao':
            // 处理签到消息
            uni.showToast({
              title: '签到成功',
              icon: 'success'
            });
            break;
          // 其他消息类型...
        }
      } else {
        console.warn('接收到非JSON格式的消息:', res.data);
      }
    } catch (error) {
      console.error('解析WebSocket消息失败:', error);
      console.error('原始消息:', res.data);
    }
      // 全局事件总线发布消息，供各组件订阅
    uni.$emit('websocket-message', res.data);
  });

  // 监听WebSocket连接关闭
  socketTask.onClose((res) => {
    console.log('WebSocket连接已关闭，关闭代码:', res.code, '原因:', res.reason);
    stopHeartbeat();
    startReconnect();
  });

  // 监听WebSocket错误
  socketTask.onError((err) => {
    console.error('WebSocket发生错误:', JSON.stringify(err));
    // 输出更详细的错误信息
    if (err.errMsg) console.error('错误消息:', err.errMsg);
    if (err.code) console.error('错误代码:', err.code);
    stopHeartbeat();
    startReconnect();
  });
}

// 发送消息
export function sendMessage(message) {
  if (socketTask && socketTask.readyState === 1) { // 1表示OPEN状态
    socketTask.send({
      data: message,
      success: () => {
        console.log('WebSocket消息发送成功'+message);

      },
      fail: (err) => {
        console.error('WebSocket消息发送失败:', err);
      }
    });
  } else {
    console.error('WebSocket未连接，消息发送失败');
    // 可选择缓存消息，连接成功后重发
  }
}

// 关闭WebSocket连接
export function closeWebSocket() {
  stopHeartbeat();
  clearTimeout(connectTimer);

  if (socketTask) {
    socketTask.close();
    socketTask = null;
  }
}

// 开始心跳检测
function startHeartbeat() {
  stopHeartbeat();
  heartTimer = setInterval(() => {
    sendMessage('ping'); // 发送心跳包
  }, HEARTBEAT_INTERVAL);
}

// 停止心跳检测
function stopHeartbeat() {
  if (heartTimer) {
    clearInterval(heartTimer);
    heartTimer = null;
  }
}

// 开始重连
function startReconnect() {
  if (reconnectCount >= MAX_RECONNECT_COUNT) {
    console.error('达到最大重连次数，停止重连');
    return;
  }

  reconnectCount++;
  clearTimeout(connectTimer);
  connectTimer = setTimeout(() => {
    console.log(`尝试重连WebSocket (${reconnectCount}/${MAX_RECONNECT_COUNT})`);
    initWebSocket();
  }, 2000 * reconnectCount); // 指数退避重连策略
}
